package settings

import (
	"fmt"

	"github.com/fsnotify/fsnotify"
	"github.com/spf13/viper"
)

var Conf = new(AppConfig)

type AppConfig struct {
	Name         string `mapstructure:"name"`
	Mode         string `mapstructure:"mode"`
	Version      string `mapstructure:"version"`
	StartTime    string `mapstructure:"start_time"`
	MachineID    int64  `mapstructure:"machine_id"`
	Port         int    `mapstructure:"port"`
	*LogConfig   `mapstructure:"log"`
	*MysqlConfig `mapstructure:"mysql"`
	*RedisConfig `mapstructure:"redis"`
}

type LogConfig struct {
	Level      string `mapstructure:"level"`
	Filename   string `mapstructure:"filename"`
	MaxSize    int    `mapstructure:"max_size"`
	MaxAge     int    `mapstructure:"max_age"`
	MaxBackups int    `mapstructure:"max_backups"`
}

type MysqlConfig struct {
	Host         string `mapstrucrure:"host"`
	Port         int    `mapstrucrure:"port"`
	User         string `mapstrucrure:"user"`
	Password     string `mapstrucrure:"password"`
	Dbname       string `mapstrucrure:"dbname"`
	MaxOpenConns int    `mapstrucrure:"max_open_conns"`
	MaxIdleCoons int    `mapstrucrure:"max_idle_conns"`
}

type RedisConfig struct {
	Host     string `mapstrucrure:"host"`
	Port     int    `mapstrucrure:"port"`
	Db       int    `mapstrucrure:"db"`
	Password string `mapstrucrure:"password"`
	PoolSize int    `mapstrucrure:"pool_size"`
}

func Init() (err error) {
	viper.SetConfigFile("./config.yaml") // 指定配置文件路径
	//viper.SetConfigName("config") // 配置文件名称(无扩展名),全局查找
	//viper.SetConfigType("yaml")   // 如果配置文件的名称中没有扩展名，则需要配置此项,(专用于远程获取配置信息)
	viper.AddConfigPath(".") // 查找配置文件所在的路径
	//viper.AddConfigPath("$HOME/.appname")  // 多次调用以添加多个搜索路径
	//viper.AddConfigPath(".")               // 还可以在工作目录中查找配置
	err = viper.ReadInConfig() // 查找并读取配置文件
	if err != nil {            // 处理读取配置文件的错误
		fmt.Println("viper.ReadInConfig failed,err:", err)
		return
	}
	err = viper.Unmarshal(Conf) // 查找并读取配置文件
	if err != nil {             // 处理读取配置文件的错误
		fmt.Println("viper.Unmarshal failed,err:", err)
		return
	}
	viper.WatchConfig()
	viper.OnConfigChange(func(in fsnotify.Event) {
		fmt.Println("配置文件修改了")
		err = viper.Unmarshal(Conf) // 查找并读取配置文件
		if err != nil {             // 处理读取配置文件的错误
			fmt.Println("viper.Unmarshal failed,err:", err)
			return
		}
	})
	return
}
